"""
难度：中等
给你一个非负整数数组 nums ，你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置，跳 1 步，然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
"""

class Solution:
       # 方法一，贪心，更新最大位置索引
    def jump(self, nums: List[int]) -> int:
        end, max_pos = 0, 0
        steps = 0
        for i in range(len(nums)-1):
            max_pos = max(max_pos, nums[i] + i)    
            if i ==end:
                end = max_pos
                steps += 1
        return steps
            # 方法二，双指针+动态规划
    def jump(self, nums: List[int]) -> int:
        n = len(nums)
        dp=[0]*n
        j=0
        for i in range(1,n): # 右指针，目标位置指针
            while j+nums[j]<i: # 找到左边最远的能一步到目标位置的指针
                j+=1
            dp[i]=dp[j]+1 # 左指针的步数加一即可到达目标位置
        return dp[-1]
